package com.dys.testjdk9;

import java.util.*;
import java.util.stream.Stream;

/**
 * @className: com.dys.testjdk9.Java9Stream
 * @description: Stream新增4个API
 * @author: pine cone
 * @version: v1.0.0
 * @createTime: 2024/09/04 下午8:43
 */
public class Java9Stream {

    /**
     * 这是一个main()方法,是应用程序的入口
     *
     * @param args 方法的形参列表,是一个字符串数组,包含了从命令行传递给程序的参数
     */
    public static void main(String[] args) {
        // testTakeWhile();
        // testDropWhile();
        // testOfNullable();
        // testNewIterate();
        testOptionalStream();
    }

    /**
     * 测试Stream新增takeWhile方法
     * takeWhile  从流中的头开始取元素,直到不满足条件为止
     */
    private static void testTakeWhile() {
        // 声明一个集合
        List<Integer> list = Arrays.asList(1, 89, 63, 45, 72, 65, 82, 35, 95, 100);
        // 从头开始取所有奇数，直到遇见一个偶数为止
        list.stream().takeWhile(e -> e % 2 == 1).forEach(System.out::println);
    }

    /**
     * 测试Stream新增dropWhile方法
     * dropWhile  从头开始删除满足条件的数据,直到遇见第一个不满足的位置,并保留剩余元素
     */
    private static void testDropWhile() {
        List<Integer> list = Arrays.asList(2, 86, 63, 45, 72, 65, 41, 65, 82, 35, 95, 100);
        // 删除流开头的所有偶数，直到遇见奇数为止
        list.stream().dropWhile(e -> e % 2 == 0).forEach(System.out::println);
    }

    /**
     * 测试Stream新增ofNullable方法
     * ofNullable 允许创建Stream流时,只放入一个null
     */
    private static void testOfNullable() {
        // of方法获取流，允许元素中多个null值
        Stream<Integer> stream1 = Stream.of(10, 20, 30, null);
        // 如果元素只有一个null,是不允许的
        Stream<Integer> stream2 = Stream.of(null);
        // Java9中，如果元素为null,返回的是一个Stream,如果不是null,返回一个只有一个元素的Stream
        Stream<Integer> stream3 = Stream.ofNullable(null);
        stream3.forEach(System.out::println);
    }

    /**
     * 测试Stream新增iterate方法
     * iterate指定种子数,指定条件和迭代方式来获取流
     */
    private static void testNewIterate() {
        // JAVA8通过 generate方法获取一个Stream
        Stream.generate(Math::random).limit(10).forEach(System.out::println);
        System.out.println("--------------------");
        // JAVA8 通过iterate获取一个Stream
        Stream.iterate(1, t -> t + 2).limit(10).forEach(System.out::println);
        // JAVA9通过重载iterate获取Stream
        Stream.iterate(0, t -> t < 10, t -> t + 1).forEach(System.out::println);
    }

    /**
     * Optional类新增Stream方法,可以将一个Optional转换为Stream
     * 除了Stream本身的扩展,Optional和Stream之间的结合也得到了改进,
     * 现在可以通过Optional的新方法将一个Optional对象转换为一个Stream对象(可能是空的)
     */
    private static void testOptionalStream() {
        List<Integer> list = new ArrayList<>();
        Collections.addAll(list, 10, 5, 45, 95, 36, 85, 47);
        Optional<List<Integer>> optionalList = Optional.ofNullable(list);
        // 通过optional的Stream方法获取一个Stream
        Stream<List<Integer>> stream = optionalList.stream();
        // 因为内部的每个元素也是一个List,通过flatMap方法,将内部的List转换为Stream后再放入一个大Stream
        stream.flatMap(x -> x.stream()).forEach(System.out::println);
    }
}
